package com.easy.framework.common.validate;

import java.util.regex.Pattern;

public class RegexValidator {

    // 手机号（13-19开头的11位数字）
    private static final String PHONE_PATTERN = "^1[3-9]\\d{9}$";

    // 固定电话（带区号，如010-12345678或01012345678）
    private static final String TEL_PHONE_PATTERN = "^0\\d{2,3}[-]?\\d{7,8}$";

    // 邮箱（标准格式，支持字母、数字、下划线及多级域名）
    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";

    // HTTP/HTTPS网址（支持域名、端口、路径、参数）
    private static final String URL_PATTERN = "^https?://([\\w-]+\\.)+[\\w-]+(:\\d{1,5})?(/[\\w-./?%&=]*)?$";

    // IPv4地址（0-255的四段数字）
    private static final String IPV4_PATTERN = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$";

    // IPv6地址（8组16进制数，支持缩写）
    private static final String IPV6_PATTERN = "^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:){1,7}:$|^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$|^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$|^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$|^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})$|^:((:[0-9a-fA-F]{1,4}){1,7}|:)$";

    // 身份证号（18位，支持最后一位为X）
    private static final String ID_CARD_PATTERN = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";

    // 邮政编码（6位数字）
    private static final String ZIP_CODE_PATTERN = "^\\d{6}$";

    // 中文姓名（2-10位汉字，支持少数民族姓名中间的点）
    private static final String CHINESE_NAME_PATTERN = "^[\\u4e00-\\u9fa5·]{2,10}$";

    // 用户名（4-20位，字母、数字、下划线，首字符为字母）
    private static final String USERNAME_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{3,19}$";

    // 密码强度（8-20位，包含大小写字母、数字、特殊符号至少两种）
    private static final String PASSWORD_PATTERN = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,20}$";

    // 日期格式（yyyy-MM-dd，支持闰年和每月天数校验）
    private static final String DATE_PATTERN = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$";

    // 银行卡号（16-19位数字，支持常见储蓄卡和信用卡）
    private static final String BANK_CARD_PATTERN = "^\\d{16,19}$";

    // 正整数（不含0）
    private static final String POSITIVE_INTEGER_PATTERN = "^[1-9]\\d*$";

    // 负整数（不含0）
    private static final String NEGATIVE_INTEGER_PATTERN = "^-[1-9]\\d*$";

    // 整数（包含正整数、负整数、0）
    private static final String INTEGER_PATTERN = "^-?[0-9]\\d*$";

    // 浮点数（包含正负浮点数，支持整数部分或小数部分省略）
    private static final String DECIMAL_PATTERN = "^-?[0-9]+(\\.[0-9]+)?$";


    /**
     * 手机号验证
     * @param phone 手机号
     * @return 是否有效
     */
    public static boolean isValidPhone(String phone) {
        return checkPattern(phone, PHONE_PATTERN);
    }

    /**
     * 固定电话验证（带区号）
     * @param telPhone 固定电话
     * @return 是否有效
     */
    public static boolean isValidTelPhone(String telPhone) {
        return checkPattern(telPhone, TEL_PHONE_PATTERN);
    }

    /**
     * 邮箱验证
     * @param email 邮箱地址
     * @return 是否有效
     */
    public static boolean isValidEmail(String email) {
        return checkPattern(email, EMAIL_PATTERN);
    }

    /**
     * URL验证（支持HTTP/HTTPS）
     * @param url URL地址
     * @return 是否有效
     */
    public static boolean isValidUrl(String url) {
        return checkPattern(url, URL_PATTERN);
    }

    /**
     * IPv4验证
     * @param ip IPv4地址
     * @return 是否有效
     */
    public static boolean isValidIpv4(String ip) {
        return checkPattern(ip, IPV4_PATTERN);
    }

    /**
     * IPv6验证
     * @param ip IPv6地址
     * @return 是否有效
     */
    public static boolean isValidIpv6(String ip) {
        return checkPattern(ip, IPV6_PATTERN);
    }

    /**
     * 身份证号验证（18位，支持最后一位为X）
     * @param idCard 身份证号
     * @return 是否有效
     */
    public static boolean isValidIdCard(String idCard) {
        return checkPattern(idCard, ID_CARD_PATTERN);
    }

    /**
     * 邮政编码验证（6位数字）
     * @param zipCode 邮政编码
     * @return 是否有效
     */
    public static boolean isValidZipCode(String zipCode) {
        return checkPattern(zipCode, ZIP_CODE_PATTERN);
    }

    /**
     * 中文姓名验证（2-10位汉字，支持少数民族姓名中间的点）
     * @param name
     * @return
     */
    public static boolean isValidChineseName(String name) {
        return checkPattern(name, CHINESE_NAME_PATTERN);
    }

    /**
     * 用户名验证（4-20位，字母、数字、下划线，首字符为字母）
     * @param username
     * @return
     */
    public static boolean isValidUsername(String username) {
        return checkPattern(username, USERNAME_PATTERN);
    }

    /**
     * 密码强度验证（8-20位，包含大小写字母、数字、特殊符号至少两种）
     * @param password
     * @return
     */
    public static boolean isValidPassword(String password) {
        return checkPattern(password, PASSWORD_PATTERN);
    }

    /**
     * 日期格式验证（yyyy-MM-dd）
     * @param date
     * @return
     */
    public static boolean isValidDate(String date) {
        return checkPattern(date, DATE_PATTERN);
    }

    /**
     * 银行卡号验证（16-19位数字）
     * @param bankCard
     * @return
     */
    public static boolean isValidBankCard(String bankCard) {
        return checkPattern(bankCard, BANK_CARD_PATTERN);
    }

    /**
     * 正整数验证（不含0）
     * @param num
     * @return
     */
    public static boolean isPositiveInteger(String num) {
        return checkPattern(num, POSITIVE_INTEGER_PATTERN);
    }

    /**
     * 负整数验证
     * @param num
     * @return
     */
    public static boolean isNegativeInteger(String num) {
        return checkPattern(num, NEGATIVE_INTEGER_PATTERN);
    }

    /**
     * 整数验证（包括正整数、负整数和0）
     * @param num
     * @return
     */
    public static boolean isInteger(String num) {
        return checkPattern(num, INTEGER_PATTERN);
    }

    /**
     * 浮点数验证
     * @param num
     * @return
     */
    public static boolean isDecimal(String num) {
        return checkPattern(num, DECIMAL_PATTERN);
    }

    /**
     * 通用校验方法，使用正则表达式对象
     *
     * @param value   要验证的字符串
     * @param pattern 正则表达式对象
     * @return 是否匹配
     */
    private static boolean checkPattern(String value, Pattern pattern) {
        if (value == null || value.trim().isEmpty()) {
            return false;
        }
        return pattern.matcher(value.trim()).matches();
    }


    /**
     * 通用校验方法，使用正则表达式字符串
     *
     * @param value     要验证的字符串
     * @param regexStr  正则表达式字符串
     * @return 是否匹配
     */
    private static boolean checkPattern(String value, String regexStr) {
        if (value == null || value.trim().isEmpty()) {
            return false;
        }
        return checkPattern(value, Pattern.compile(regexStr));
    }
}
